 


program pol;
uses crt;

var i,ste:longint;           pole,a,b,step,ep,tmp,delta:real; //do liczenia pola
krok:real; o,polecalkowite:real; ost:boolean;
arMiejsca:array[1..100] of real;
miejsca:integer;
label skip,brakmiejsc;

function f(x:real):real;
begin
//f:=x*x*2-x*6+3;
f:=x*x-4;
end;

function p(a,b:real;d:longint):real;
var start,e,tmp,pp:real;i:longint;
begin
pp:=0;
tmp:=(b-a)/d;
start:=a;
for i:=1 to d do
        begin
           e:=start+tmp;
           pp:=pp+tmp*abs(f(start))/2+abs(f(e))/2;
           start:=e;
        end;
//writeln('pole przy podziale na ',d, ' to ', pp:2:9);
p:=pp;
end;

function ppole(a,b:real):real;
begin
ste:=1;
pole:=p(a,b,ste);
repeat
      tmp:=pole;
      ste:=ste*2;
      pole:=p(a,b,ste);
until tmp-pole<=ep;
ppole:=pole;
end;

function getZeroFrom(a,b:real):real;
//zalozenie: f(a) i f(b) maja rozne znaki, a<b;
//a to poczatek przedzialu,
//b to koniec przedzialu
//zal. 2.: w <a,b) jest dokladnie jedno miejsce zerowe.
var pol:real;
begin
pol:=(a+b)/2;
if a-b<=delta then getZeroFrom:=a
else
        begin
          if f(a)*f(a+pol)<0 then getZeroFrom:=getZeroFrom(a,a+pol)
                else getZeroFrom:=getZeroFrom(a+pol,b);
        end
end;

begin
clrscr;
writeln('podaj dokladnosc szukania pola');
readln(ep);
//ep:=0.00001;
writeln('z jaka dokladnoscia szukac miejsc zerowych?');
readln(krok);
//krok:=0.00001;
writeln('Poczatek badanego przedzialu: ');
readln(a);
//a:=-4;
writeln('Koniec badanego przedzialu: ');
readln(b);
//b:=8;
if a>b then begin pole:=a; a:=b; b:=pole; end;
ost:=false;
o:=a;
miejsca:=0;
polecalkowite:=0;
delta:=ep;
repeat
//writeln('licze ',o:2:2, ';', o+krok:2:2);
if (f(o)*f(o+krok)>0) then goto skip;
        writeln('z duzym prawdopodobienstwem w prezdziale <',o:2:10,',',o+krok:2:2,'> jest miejsce zerowe');
        inc(miejsca);
        arMiejsca[miejsca]:=getZeroFrom(o,o+krok);

skip:
if ost then break;
if o+krok<b then o:=o+krok else begin o:=b; ost:=true;end;
until false;
writeln('koniec. Raport:');

if miejsca=0 then begin arMiejsca[1]:=b; miejsca:=1; goto brakmiejsc;end;

writeln('miejsca zerowe to: ');
for i:=1 to miejsca do
   writeln(arMiejsca[i]:2:5);
brakmiejsc:
polecalkowite:=ppole(a,arMiejsca[1]);
for i:=2 to miejsca do
polecalkowite:=polecalkowite+ppole(arMiejsca[i-1],arMiejsca[i]);
//polecalkowite:=polecalkowite+ppole(arMiejsca[miejsca],b);

 

writeln('Pole calkowite to ',polecalkowite:2:5);

readln;

end.

